#include <string>

#include <sw/redis++/redis.h>
#include <gflags/gflags.h>
#include <iostream>
#include <thread>

DEFINE_string(ip, "127.0.0.1", "这是服务器的IP地址,格式为:127.0.0.1");
DEFINE_int32(port, 6379, "这是服务器的端口号,格式为:8080");
DEFINE_int32(db, 0, "库的编号,默认是0号");
DEFINE_bool(keep_alive, true, "是否进行长连接保活");

void print(sw::redis::Redis &client)
{
    auto user1 = client.get("会话ID1");
    if (user1)
        std::cout << *user1 << std::endl;
    auto user2 = client.get("会话ID2");
    if (user2)
        std::cout << *user2 << std::endl;
    auto user3 = client.get("会话ID3");
    if (user3)
        std::cout << *user3 << std::endl;
    auto user4 = client.get("会话ID4");
    if (user4)
        std::cout << *user4 << std::endl;
    auto user5 = client.get("会话ID5");
    if (user5)
        std::cout << *user5 << std::endl;
}

void add_string(sw::redis::Redis &client)
{
    client.set("会话ID1", "用户ID1");
    client.set("会话ID2", "用户ID2");
    client.set("会话ID3", "用户ID3");
    client.set("会话ID4", "用户ID4");
    client.set("会话ID5", "用户ID5");

    client.del("会话ID3");

    // 数据存在则进行修改,不存在就新增
    client.set("会话ID5", "用户ID555");

    print(client);
}

void expired_test(sw::redis::Redis &client)
{
    // 这次的新增,数据已经存在,所以为修改
    // 不仅修改了val,还给新的键值设置了过期时间
    client.set("会话ID1", "用户ID111", std::chrono::milliseconds(1000));

    print(client);

    std::cout << "----------休眠2s------------" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(2));
    print(client);
}

void list_test(sw::redis::Redis &client)
{
    client.rpush("群聊1", "成员1");
    client.rpush("群聊1", "成员2");
    client.rpush("群聊1", "成员3");
    client.rpush("群聊1", "成员4");
    client.rpush("群聊1", "成员5");

    std::vector<std::string> users;
    client.lrange("群聊1", 0, -1, std::back_inserter(users));

    for (auto user : users)
    {
        std::cout << user << std::endl;
    }
}

int main(int argc, char *argv[])
{
    google::ParseCommandLineFlags(&argc, &argv, true);

    // 实例化redis对象,连接服务器
    sw::redis::ConnectionOptions options;
    options.host = FLAGS_ip;
    options.port = FLAGS_port;
    options.db = FLAGS_db;
    options.keep_alive = FLAGS_keep_alive;
    sw::redis::Redis client(options);
    // 多次测试让群聊中的数据多次打印，所以先删除库中的所有数据
    client.flushdb();

    // 添加字符串键值对,删除键值对,获取字符串键值对
    add_string(client);

    std::cout << "-------------------------" << std::endl;
    // 控制数据的有效时间
    expired_test(client);

    // 列表的操作,实现数据的右插,左获取
    std::cout << "-------------------------" << std::endl;
    list_test(client);
    return 0;
}